<!DOCTYPE html>
<html >
<head>

    <!--[if lt IE 9]>
        <style>body {display: none; background: none !important} </style>
        <meta http-equiv="Refresh" Content="0; url=//outdatedbrowser.com/" />
    <![endif]-->

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="format-detection" content="telephone=no" />
<meta name="author" content="潍夫子" />


    
    


<meta property="og:type" content="website">
<meta property="og:title" content="潍夫子的个人博客">
<meta property="og:url" content="http://weifuzi.oschina.io/index.html">
<meta property="og:site_name" content="潍夫子的个人博客">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="潍夫子的个人博客">

<link rel="apple-touch-icon" href= "/apple-touch-icon.png">


    <link rel="alternate" href="/atom.xml" title="潍夫子的个人博客" type="application/atom+xml">



    <link rel="shortcut icon" href="/favicon.png">



    <link href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css" rel="stylesheet">



    <link href="//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.css" rel="stylesheet">



    <script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script>
    <link href="//cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-minimal.css" rel="stylesheet">


<link rel="stylesheet" href="/css/style.css">


    <style> .article { opacity: 0;} </style>


<link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">


<title>潍夫子的个人博客</title>

<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

<script>
    var yiliaConfig = {
        fancybox: true,
        animate: true,
        isHome: true,
        isPost: false,
        isArchive: false,
        isTag: false,
        isCategory: false,
        fancybox_js: "//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.js",
        scrollreveal: "//cdn.bootcss.com/scrollReveal.js/3.1.4/scrollreveal.min.js",
        search: true
    }
</script>


    <script> yiliaConfig.jquery_ui = [false]; </script>



    <script> yiliaConfig.rootUrl = "\/";</script>






</head>
<body>
  <div id="container">
    <div class="left-col">
    <div class="overlay"></div>
<div class="intrude-less">
    <header id="header" class="inner">
        <a href="/" class="profilepic">
            <img src="/img/avatar.png" class="animated zoomIn">
        </a>
        <hgroup>
          <h1 class="header-author"><a href="/">潍夫子</a></h1>
        </hgroup>

        

        
            <form id="search-form">
            <input type="text" id="local-search-input" name="q" placeholder="search..." class="search form-control" autocomplete="off" autocorrect="off" searchonload="false" />
            <i class="fa fa-times" onclick="resetSearch()"></i>
            </form>
            <div id="local-search-result"></div>
            <p class='no-result'>No results found <i class='fa fa-spinner fa-pulse'></i></p>
        


        

        <div id="switch-area" class="switch-area">
            <div class="switch-wrap">
                <section class="switch-part switch-part1">
                    <nav class="header-menu">
                        <ul>
                        
                            <li><a href="/">主页</a></li>
                        
                            <li><a href="/archives/">所有文章</a></li>
                        
                            <li><a href="/tags/">标签云</a></li>
                        
                        </ul>
                    </nav>
                    <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" href="mailto:yuyekuangmo@qq.com" title="Email"></a>
                            
                        </ul>
                    </nav>
                </section>
                
                
                
                

                
                
                <section class="switch-part switch-part3">
                
                    <div id="js-aboutme">没事打酱油</div>
                </section>
                
            </div>
        </div>
    </header>                
</div>
    </div>
    <div class="mid-col">
      <nav id="mobile-nav">
      <div class="overlay">
          <div class="slider-trigger"></div>
          <h1 class="header-author js-mobile-header hide"><a href="/" title="回到主页">潍夫子</a></h1>
      </div>
    <div class="intrude-less">
        <header id="header" class="inner">
            <a href="/" class="profilepic">
                <img src="/img/avatar.png" class="animated zoomIn">
            </a>
            <hgroup>
              <h1 class="header-author"><a href="/" title="回到主页">潍夫子</a></h1>
            </hgroup>
            
            <nav class="header-menu">
                <ul>
                
                    <li><a href="/">主页</a></li>
                
                    <li><a href="/archives/">所有文章</a></li>
                
                    <li><a href="/tags/">标签云</a></li>
                
                <div class="clearfix"></div>
                </ul>
            </nav>
            <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" target="_blank" href="mailto:yuyekuangmo@qq.com" title="Email"></a>
                            
                        </ul>
            </nav>
        </header>                
    </div>
    <link class="menu-list" tags="Tags" friends="Friends" about="About Me"/>
</nav>
      <div class="body-wrap">
  
    <article id="post-buyHouse" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2019/04/02/buyHouse/" class="article-date">
      <time datetime="2019-04-02T06:20:27.000Z" itemprop="datePublished">2019-04-02</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2019/04/02/buyHouse/">置业储备</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="开发商售房资质"><a href="#开发商售房资质" class="headerlink" title="开发商售房资质"></a>开发商售房资质</h2><h3 id="五证（购房）"><a href="#五证（购房）" class="headerlink" title="五证（购房）"></a>五证（购房）</h3><blockquote>
<ol>
<li><p><strong>国有土地使用证</strong>：由市国土资源和房屋管理局核发。（国土局）</p>
<ul>
<li>盖有人民政府公章、房屋土地行政主管部门公章、有偿土地使用证专用章，证上土地使用者应与开发商名称完全一致，注意有无土地使用权抵押记录。</li>
<li>《临时国有土地使用证》只能用于办理预售许可证和开工证，不代表已取得最终土地使用权。一般是开发商先期缴了一部分地价款，如后期款项不能足额交付，就拿不到《国有土地使用证》，这是购房者办理产权证的一个重大隐患。</li>
<li>土地使用证规定你是用于农业、工业、商业还是住房等。</li>
<li>注意土地的使用年限</li>
</ul>
</li>
<li><p><strong>建设用地规划许可证</strong>：由城市、县人民政府城乡规划主管部门或者省、自治区、直辖市人民政府确定的镇人民政府核发。（规划局）</p>
<ul>
<li>看开发商所使用的土地用途、位置和界限是否与建设用地规划许可证相一致。</li>
<li>建委的《建设工程开工许可证》是工程可开工的法律凭证，开发商出售的是期房，应要求出示该证。如是现房，应查看建委发放的《建设工程竣工备案表》</li>
</ul>
</li>
<li><p><strong>建设工程规划许可证</strong>：由城市、县人民政府城乡规划主管部门或者省、自治区、直辖市人民政府确定的镇人民政府核发。（规划局）</p>
</li>
<li><p><strong>建筑工程施工许可证</strong>：由工程所在地的县级以上人民政府建设行政主管部门核发。（建设局）</p>
</li>
<li><p><strong>商品房预售许可证</strong>：由工程所在地的县级以上人民政府建设行政主管部门核发。（房管局）</p>
<ul>
<li>签合同前注意所预购的房屋是不是在预售范围内，提防开发商“偷梁换柱”，还要注意是否在有效期内。</li>
<li>购房者要仔细核对卖方的名称与预售许可证上载明的是否一致。避免开发商未通知购房者就将已抵押的商品房预售。</li>
<li>房地产商在销售商品房时，如该房屋已建成，还应持有房屋所有权证书。购房者如需调查房屋的建筑质量，还可查验房地产商的《工程验收证》。</li>
</ul>
</li>
</ol>
<p>主要查看《国有土地使用证》和《商品房预售许可证》，注意查看原件，复印件容易造假。</p>
</blockquote>
<h3 id="二书（交房）"><a href="#二书（交房）" class="headerlink" title="二书（交房）"></a>二书（交房）</h3><blockquote>
<ol>
<li>住宅质量保证书</li>
<li>住宅使用说明书</li>
</ol>
</blockquote>
<h3 id="一表（交房）"><a href="#一表（交房）" class="headerlink" title="一表（交房）"></a>一表（交房）</h3><blockquote>
<p>竣工验收备案表</p>
</blockquote>
<h2 id="选房考虑要素"><a href="#选房考虑要素" class="headerlink" title="选房考虑要素"></a>选房考虑要素</h2><h3 id="开发商"><a href="#开发商" class="headerlink" title="开发商"></a>开发商</h3><blockquote>
<ol>
<li>口碑：一般好的开发商资质高、资金充足。</li>
<li>优惠：对于开发商给出的优惠，要多打听，多分析，多判断，不要盲目追风。</li>
<li>规模：优先选择大盘买房，因为大楼盘设施齐全、占地面积大、绿化更好、周边配套设施更容易发展起来。</li>
<li>注意开发商房地产资质等级，一级好，二级还不错，三级就比较一般了。</li>
</ol>
</blockquote>
<h3 id="户型"><a href="#户型" class="headerlink" title="户型"></a>户型</h3><blockquote>
<ol>
<li>朝向：正朝南不一定就是最 好，考虑到风向、通风因素，住宅建筑设计有南偏东、偏西30度也很正常。<ul>
<li>南：阳光充足，冬暖夏凉，冬季阳光能照射至房屋室内深处，让室内明亮温暖，夏季朝南的房屋便于避开阳光直射，避开阳光的强烈洗礼，良好的通风还能保持室内的清新干燥。</li>
<li>东南：东南朝向的户型一般采光较好，但通风略显不足，房屋内易潮湿。</li>
<li>西南：采光较好，但是有一定的西晒困扰。</li>
<li>东：光照时间早，只有上午有阳光，通风较差。</li>
<li>西：住过西向户型的都知道，采光时间短，西晒强烈，夏季较热，但是西朝向所带来的好处是可以晾晒衣物、被褥，而且还可以通过增加阳台的方法来降低光的摄入量。</li>
<li>北：采光最差，夏天凉快，但冬天阴冷，容易造成房子潮湿的情况，不方便晾晒衣服，但是朝北的房屋是夏日里最凉爽的。</li>
</ul>
</li>
<li>楼层：<ul>
<li>中间层房屋的空气质量相较于低层更好，出行较高层更方便，可以说是折中。</li>
<li>1-4层往往因为有树丛、绿化的第一重过滤，噪音有所减小，而5-8层却因为无遮挡物，噪音更甚。</li>
<li>扬灰层：有说8-10层，也有说9-11层。但扬灰层是否存在有待商榷。</li>
<li>心理忌讳：带4，谐音死；13，西方避讳；18，谐18层地狱；8，七上八下。</li>
<li>楼层太高，如果窗户的隔音不好会有风声和噪声。且对水压气压要求更高。</li>
<li>远离设备层，设备层是专门供水，供电的中间楼层，要是常年居住在设备层的附近的话，不仅机器设备的噪音把人折磨得无法休息，连机器的辐射也会影响人的身体健康。</li>
<li>避免顶（1~2）层，顶层一到大夏天，不仅闷热，不透气，还容易漏水；且对水压、气压要求高；遇到灾害不容易逃生。</li>
<li>避免底（1~2）层，底层不仅容易潮湿，发霉，滋生蚊子，光线也不好且易出现水管堵住，污水外溢的问题；</li>
<li>避免楼对楼的高层，花了高价却没享受到高层的视野。</li>
</ul>
</li>
<li>楼间距：前后间距主要满足日照、通风、视觉卫生、景观等方面的要求；左右间距主要满足消防、交通、防噪等方面的要求。</li>
<li>噪音：看房屋周边设施，考虑噪音影响。</li>
<li>进深、开间</li>
<li>容积率：容积率是指一定地块内，总建筑面积与建筑用地面积的比值。比如说，在面积为100平方米的地块上，每层建筑面积100平方米，建2层，总建筑面积200平方米，容积率就是2；如果建3层，总建筑面积300平方米，容积率就是3。</li>
<li>公摊面积：<ul>
<li>不要太相信美颜过的样板间，异地设计的样板尺寸、屋内的格局虽然大差不离，但多数开发商不会真的1:1，把尺寸适当放大、把墙体做薄是最常用的伎俩，改造套内的布局、展示迷你缩小版的家具更是家常便饭。</li>
<li>问开发商要关于公摊面积的准确数据，确切了解到套内每间房子的长宽尺寸，自己计算套内到底有多大。</li>
</ul>
</li>
<li>得房率：是指你套内建筑面积与套型建筑面积（销售面积）的比例。<ul>
<li>套内建筑面积：套内使用面积+套内墙体面积+阳台建筑面积的总和</li>
<li>阳台面积：阳台当其上盖高度小于两个自然层时，按其围护结构外围水平投影计算一半建筑面积；阳台上盖与阳台围护结构外围的水平投影线不完全一致时，按上盖或阳台围护结构较少的水平投影计算一半建筑面积;当上盖宽度不大于0.6米时，阳台不计算建筑面积。阳台当其上盖高度达到或超过两个自然层，阳台不计算建筑面积；一户的阳台板相连的两个相邻阳台按一个阳台计算指标，并相应计算建筑面积。（计算规则可能会有差异）</li>
<li>套型建筑面积：套内建筑面积 + 分摊的公用建筑面积</li>
</ul>
</li>
<li>产权年限：一般为70年，也有40年或者50年的。年限是从开发商初拿到这块地的时候算起。</li>
<li>楼栋位置：避开地下车库的出入口、交通主干道旁的楼栋，正对马路或小区大门的房慎选，以避开噪音和汽车灯光。要关注所选楼栋距离小区出口、车站的距离远近。另外，楼栋的景观视野如何也不可忽视，比如可观小区水景或湖景。</li>
</ol>
</blockquote>
<h3 id="规划"><a href="#规划" class="headerlink" title="规划"></a>规划</h3><blockquote>
<ol>
<li>注意小区环境，小区景观、绿化、配套等</li>
<li>注意看房子所处地段，在购置房产时，要切记紧跟城市发展的方向。</li>
<li>考虑孩子问题，买地产要考虑孩子路上的安全问题，尽量选择距离近的房子。这样可以给孩子节约大量的时间，让孩子有充裕的时间学习和休息。</li>
<li>人车分流</li>
<li>避免周边有垃圾处理厂、焚烧厂、屠宰场、污水处理厂、殡仪馆、重工业企业等，污水和废气的排放，影响人们的身体健康。</li>
<li>停车位配比应至少达到1:1。</li>
<li>绿化率和绿地率是两个不同的概念，但置业顾问常常会把绿化率当绿地率介绍，就是为了让购房者混淆。绿地率指的是小区用地范围内各类绿地的总和与小区用地的比率，主要包括公共绿地、宅旁绿地、配套公建所属绿地和道路绿地等。绿化率的准确说法是“绿化覆盖率”，具体是指绿化垂直投影面积之和与小区用地的比率，简言之就是只要有块草皮就可以计入，没有参考意义。</li>
</ol>
</blockquote>
<h3 id="物业"><a href="#物业" class="headerlink" title="物业"></a>物业</h3><blockquote>
</blockquote>
<h3 id="合同"><a href="#合同" class="headerlink" title="合同"></a>合同</h3><blockquote>
<ol>
<li>购房定金，定金对买受人是极为不利的，使买受人在签约的时候处于不利的境地，买受人往往在定金不退的压力下，违心地接受开发商的不平等条款。</li>
<li>签认购书，认购书基本条款要约定详细，对所要购买的房屋的主要情况在认购书中予以约定。条款内容约定要合法有效，要求开发商提供作为正式签约的商品房买卖合同文本。</li>
<li>在签订合同时，一定要选用房地产管理部门一致印制的标准房屋买卖合同文本，并依照合同文本中所列条款逐条逐项填写。切记！千万不能大意。</li>
<li>一定要留意合同条款中双方所填写的内容中权力与责任是不是对等。</li>
<li>在合同中对付款的数额、期限、方法及违约责任等作出约定。</li>
<li>一定要约定好交房日期，购房者在签定合同时，必定要将交房日期明白无误地规定为“某年某月某日”，并注明开发商不能准时交房所需承当的责任。</li>
<li>签合同前要确认房屋有没有做过抵押，除了银行按揭有没有别的。</li>
<li>贷款审批未通过原因有二，其一是申请人征信记录不符合要求，其二是开发商原因导致。如遇第二种情况，应及时取证，存证，为维权做准备。</li>
<li>合同主体要明确，有的项目开发者是一个公司，而投资方是另一个公司，而作为购房者要签的合同另一方是开发者。签约时要看看另一方签字的是不是法定代表人，有的持有法定代表人给的“授权委托书”也可以签，否则签字无效。</li>
<li>开发商提供的补充协议要先仔细查看后再签字。</li>
<li>预售协议和物业管理协议应区分开，如果物业公司的服务标准、收费情况没有确定，就要求缴纳费用，损害的是购房者的利益。</li>
<li>注意概念模糊的用词，如最短时间内解决、较好、尽快等。开发商的承诺要变成白纸黑字，涉及到时间、地点、材料的一定要清楚。</li>
<li>合同以偏概全，比如开发商承诺卧室的玻璃是中空的，到了交房时发现卧室窗户只有下面的部分是中空，而上面却是普通玻璃等等。</li>
<li>处理结果不明确，如合同规定在什么时候做什么事，而且是必须的语气，但并没有说明如果没有完成，会有怎样处理。</li>
</ol>
</blockquote>
<h3 id="选房时需要了解的情况"><a href="#选房时需要了解的情况" class="headerlink" title="选房时需要了解的情况"></a>选房时需要了解的情况</h3><blockquote>
<ol>
<li>物业费多少，什么物业公司？</li>
<li>房屋的价格？按什么面积计算房屋价格的？</li>
<li>交房时间</li>
<li>公摊比例</li>
<li>梯户比：一梯两户、两梯三户/四户或多户</li>
<li>停车位问题：地上车位、地下车位或地上地下车位均有，车位比多少，收费标准，可租可售或只租/只售，是否人车分流</li>
<li>了解楼盘的实际销售情况，具体的了解渠道可以是楼盘广告、售楼书、入住的购房者、房地产业内人士等。</li>
<li>注意开发商和销售商可能不同，开发商和销售商有时不分，有时为两家甚至多家</li>
<li>在看房时，应保留楼盘的宣传广告单，作为日后收房后的证据。</li>
<li>合同约定尽量详细。</li>
<li>不少开发商都会打出“交XX抵XX”的优惠活动，这时你就需要问清楚，你交的到底是定金还是订金。定金和订金不同，前者是不可退的，后者才可以退还。</li>
<li>问售楼员要一个销控的本子，这样你就可以确认哪些房子卖完了，哪些房子还是在售中。</li>
<li>施工单位好不好，主要看工地是否干净，建材堆放是否井井有条。</li>
<li>一般情况下补充协议里都会有一条：如果购房合同与补充协议有冲突，请以补充协议为准，SO不要拿补充协议这个豆包不当干粮，核对条款跟上述一样要更要看仔细！！！</li>
<li>了解样板间厨房、卫生间的管道位置。</li>
</ol>
</blockquote>
<h3 id="常见开发商套路"><a href="#常见开发商套路" class="headerlink" title="常见开发商套路"></a>常见开发商套路</h3><blockquote>
<ol>
<li>以虚假内容为噱头，广告中说了各种小区绿化、景观、健身房等美好的描述，但却不写在购房合同里。等购房者提出想看书面文件及资料时，销售人员又谎称尚未印出来等，进行搪塞。空口无凭的承诺，为购房者埋下了隐患。</li>
<li>购房送阳台、两房变三房、书房半赠送、送车位等，要么赠送的面积本来就是你的，比如开放式阳台本来就只计算一半的面积。而车位很可能只是使用权，不能写入购房合同和房产证，开发商什么时候心情不好了，说拿走就拿走了。</li>
<li>定金难退</li>
<li>通过各种方式营造火爆的购房现象，比如媒体的软文，请来的房托，还有有意蒙蔽购房者说房子已经售完，以此来刺激购房者的买房冲动。又或是每次开盘都只推出部分房源，造成一种哄抢的局面。</li>
<li>隐瞒“不利因素”，如有垃圾场、变电站、高压线等设施或其土地之前曾拿来建化工厂等</li>
<li>赠送“私属空间”名不副实，购房者可要求开发商明确赠送空间的性质以及今后的使用功能，并保留相关的宣传资料以备日后维权之需。</li>
<li>赠送面积是不受法律保护，房产证上面赠送面积不会加入，这是意味着没有产权的面积空间。根据物权法的相关规定，1楼或顶楼赠送的花园或天台，实际上是归业主共有的，而且赠送面积开发商通常不会写入合同，一旦产生纠纷，恐怕高位接盘的业主就得不偿失了。</li>
<li>买房返现也是现今大多数开发商喜欢使用的手段，告诉购房者虽然你现在掏了不少钱买房，但是之后会以礼包的形式返还一部分给你，但其实等真的拿到这些礼包的时候就发现，想要提现或使用都是有条件限制的。</li>
<li>警惕房托（中年大妈等），不要轻易被假象迷惑。千万要冷静，保证看中再买。</li>
<li>没有购房资格交钱留房，这种套路风险很大，因为不能网签，也就是不能在政府部门备案。如果遇到不好的开发商，那可能会一房二卖，很难保障自己的权益。</li>
<li>代理公司售楼会有各种花样，比如排队买号等。</li>
<li>样板间灯光全开隐藏采光缺陷；使用定制迷你家具，给人空间更大的假象；不配置管线，使样板间看起来更整洁。</li>
</ol>
</blockquote>
<h2 id="二手房"><a href="#二手房" class="headerlink" title="二手房"></a>二手房</h2><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><blockquote>
<ol>
<li>签订合同前认真核实房主身份，防止假房主骗卖或者一方多卖的情况。卖方不是房屋所有权人的，应提供房屋所有权人的授权委托书。</li>
<li>合同上要明确标明房屋基本情况和各种费用的交接时间和方式。包括地址、门牌号、面积和户型。</li>
<li>合同写明违约责任和合理利用补充条款。</li>
<li>核实房产有没有被司法机关和行政机关依法裁定、决定查封或以其他形式限制房地产权利；核实房产是否已设定抵押。</li>
<li>经过中介的话要查验中介机构的营业执照和备案证明。</li>
<li>不购买未取得《不动产权证书》或《房屋所有权证》的二手房。</li>
<li>交易过户时，为保障房款安全，应存入市住建局交易中心资金监管账户。</li>
</ol>
</blockquote>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/置业/">置业</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/其它/">其它</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-CSS初探" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2019/03/28/CSS初探/" class="article-date">
      <time datetime="2019-03-28T03:59:43.000Z" itemprop="datePublished">2019-03-28</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2019/03/28/CSS初探/">CSS初探</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="基本样式"><a href="#基本样式" class="headerlink" title="基本样式"></a>基本样式</h2><blockquote>
<p>样式分为三种方式：内联式、嵌入式、外部式。（优先级：内联式&gt;嵌入式&gt;外部式）（但是嵌入式&gt;外部式有一个前提：嵌入式css样式的位置一定在外部式的后面即head中link标签应写在style标签之前）总结来说，就是–就近原则（离被设置元素越近优先级别越高）</p>
</blockquote>
<h2 id="选择器"><a href="#选择器" class="headerlink" title="选择器"></a>选择器</h2><h3 id="选择器种类"><a href="#选择器种类" class="headerlink" title="选择器种类"></a>选择器种类</h3><blockquote>
<p>标签选择器：<code>标签选器名称{css样式代码;}</code></p>
<p>类选择器：<code>.类选器名称{css样式代码;}</code> <code>&lt;span class=&quot;stress&quot; &gt;</code></p>
<p>ID选择器：<code>#ID选器名称{css样式代码;}</code> <code>&lt;span id=&quot;stress&quot; &gt;</code></p>
</blockquote>
<h3 id="选择器的补充说明"><a href="#选择器的补充说明" class="headerlink" title="选择器的补充说明"></a>选择器的补充说明</h3><blockquote>
<ol>
<li>类选择器和ID选择器的区别：ID选择器只能在文档中使用一次，类选择器可以使用类选择器词列表方法为一个元素同时设置多个样式<code>&lt;span class=&quot;class1 class2&quot;&gt;</code></li>
<li>子选择器：即加入符号<code>&gt;</code>，用于选择指定标签元素的第一代子元素。如<code>.food&gt;span{border:1px solid red;}</code></li>
<li>￼后代选择器，即加入符号<code>空格</code>，用于选择指定标签元素的所有子元素。如<code>.food span{border:1px solid red;}</code></li>
<li>通用选择器，是匹配html中所有标签元素 <code>* {color:red;}</code></li>
<li>分组选择器，当你想为html中多个标签元素设置同一个样式时，可以使用分组选择符<code>,</code>。如<code>h1,span{color:red;}</code></li>
</ol>
</blockquote>
<h2 id="常用样式"><a href="#常用样式" class="headerlink" title="常用样式"></a>常用样式</h2><h3 id="字体样式"><a href="#字体样式" class="headerlink" title="字体样式"></a>字体样式</h3><blockquote>
<ul>
<li><code>font-family:&quot;Microsoft Yahei&quot;;</code></li>
<li><code>font-size:12px;</code></li>
<li>字体颜色：<code>color:#666;</code></li>
<li>文字加粗：<code>font-weight:bold;</code></li>
<li>斜体：<code>font-style:italic;</code></li>
<li>下划线：<code>text-decoration:underline;</code></li>
<li>中划线、删除线：<code>text-decoration:line-through;</code></li>
</ul>
</blockquote>
<h3 id="段落样式"><a href="#段落样式" class="headerlink" title="段落样式"></a>段落样式</h3><blockquote>
<ul>
<li>缩进：<code>text-indent:2em;</code>2em的意思就是文字的2倍大小。</li>
<li>行高: <code>line-height:1.5em;</code> 行高大于1em则会有行间距，默认不为1em。</li>
<li>中文或字母间距：<code>letter-spacing:50px;</code></li>
<li>英文单词间隔：<code>word-spacing:50px;</code></li>
<li>段落对其方式：<code>text-align:(center、left、right);</code></li>
</ul>
</blockquote>
<h3 id="其他样式"><a href="#其他样式" class="headerlink" title="其他样式"></a>其他样式</h3><blockquote>
<ul>
<li>颜色值：<ul>
<li>缩写：当设置的颜色是16进制的色彩值时，如果每两位的值相同，可以缩写一半。<code>#000000-&gt;#000</code> <code>#336699-&gt;#369</code></li>
<li>字体颜色：<code>color</code></li>
<li>背景颜色：<code>background-color</code></li>
<li>边框颜色：<code>border</code></li>
<li>颜色设置方式：<ol>
<li><code>red、blue...</code></li>
<li><code>rgb(133,45,200)</code></li>
<li><code>rgb(20%,33%,25%)</code></li>
<li><code>#00ffff</code></li>
</ol>
</li>
</ul>
</li>
<li>水平居中：<ul>
<li>行内元素：给父元素设置 <code>text-align:center;</code> 来实现。</li>
<li>定宽块状元素：满足定宽和块状两个条件的元素是可以通过设置<code>margin-left:auto</code>和<code>margin-right:auto</code>来实现居中。</li>
<li>不定宽块状元素：<ol>
<li>利用table标签的长度自适应性—即不定义其长度也不默认父元素body的长度（table其长度根据其内文本长度决定），因此可以看做一个定宽度块元素，然后再利用定宽度块状居中的margin的方法，使其水平居中。【1、为需要设置的居中的元素外面加入一个table标签，包括 <code>&lt;tbody&gt;</code>、<code>&lt;tr&gt;</code>、<code>&lt;td&gt;</code> ；2、为这个 table 设置“左右 margin为auto”】。</li>
<li>设置<code>display: inline;</code>：改变块级元素的display为inline类型（设置为行内元素显示），然后使用<code>text-align:center;</code>来实现居中效果。</li>
<li>设置<code>position:relative;</code>：过给父元素设置float，然后给父元素设置<code>position:relative</code>和<code>left:50%</code>，子元素设置<code>position:relative</code>和<code>left: -50%</code>来实现水平居中。</li>
</ol>
</li>
</ul>
</li>
<li><p>垂直居中：</p>
<ol>
<li>父元素高度确定的单行文本：设置父元素的<code>height</code>和<code>line-height</code>高度一致来实现。</li>
<li><p>父元素高度确定的多行文本：使用插入<code>table</code>的方式，(包括<code>tbody</code>、<code>tr</code>、<code>td</code>)标签，同时设置<code>vertical-align：middle;</code></p>
<p><em><code>vertical-align</code>在父元素设置此样式时，会对inline-block类型的子元素都有用。table默认为middle</em>。<br>￼</p>
<h2 id="元素分类"><a href="#元素分类" class="headerlink" title="元素分类"></a>元素分类</h2><h3 id="块级元素"><a href="#块级元素" class="headerlink" title="块级元素"></a>块级元素</h3><p>在html中<code>&lt;div&gt;、&lt;p&gt;、&lt;h1&gt;、&lt;form&gt;、&lt;ul&gt;、&lt;li&gt;</code>就是块级元素。可以通过设置<code>display:block</code>将其他元素以块级元素显示。</p>
</li>
</ol>
</li>
</ul>
<p>特点：</p>
<ol>
<li>每个块级元素都从新的一行开始，并且其后的元素也另起一行。</li>
<li>元素的高度、宽度、行高以及顶和底边距都可设置。</li>
<li>元素宽度在不设置的情况下，是它本身父容器的100%（和父元素的宽度一致），除非设定一个宽度。<br>￼<h3 id="内联元素（行内元素）"><a href="#内联元素（行内元素）" class="headerlink" title="内联元素（行内元素）"></a>内联元素（行内元素）</h3>在html中，<code>&lt;span&gt;、&lt;a&gt;、&lt;label&gt;、&lt;strong&gt;、&lt;em&gt;</code>就是典型的内联元素（行内元素）元素。可以通过设置<code>display:inline</code>将其他元素以内联元素显示。</li>
</ol>
<p>特点：</p>
<ol>
<li>和其他元素都在一行上；</li>
<li>元素的高度、宽度及顶部和底部边距不可设置；</li>
<li>元素的宽度就是它包含的文字或图片的宽度，不可改变。</li>
</ol>
</blockquote>
<h3 id="内联块状元素"><a href="#内联块状元素" class="headerlink" title="内联块状元素"></a>内联块状元素</h3><blockquote>
<p>在html中，<code>&lt;img&gt;、&lt;input</code>&gt;标签就是这种内联块状元素。</p>
<p>特点：</p>
<ol>
<li>和其他元素都在一行上；</li>
<li>元素的高度、宽度、行高以及顶和底边距都可设置。</li>
</ol>
</blockquote>
<p>不论之前是什么类型元素，<code>display:none</code>除外，设置了<code>position : absolute</code>或<code>float : left 或 float:right</code>，元素的display显示类型就会自动变为以 <code>display:inline-block</code>的方式显示，且默认宽度不占满父元素</p>
<h2 id="盒模型"><a href="#盒模型" class="headerlink" title="盒模型"></a>盒模型</h2><h3 id="常用属性"><a href="#常用属性" class="headerlink" title="常用属性"></a>常用属性</h3><blockquote>
<ul>
<li>边框样式：<code>border-style：dashed（虚线）| dotted（点线）| solid（实线）</code></li>
<li>边框颜色：<code>border-color:#888(十六进制)</code></li>
<li>边框宽度：<code>border-width：2px</code></li>
<li>简写方式：<code>border:2px  solid  red;</code></li>
<li>内边距：<code>padding:20px 10px 15px 30px;（上、右、下、左）</code>【简写方式有：<code>padding:10px;</code>（上下左右为10px）；<code>padding:10px 20px;</code>（上下为10px，左右为20px）；<code>padding:10px 20px 30px;</code>（上为10px，左右为20px，下为30px）】</li>
<li>外边距：<code>margin</code>，同内边距</li>
</ul>
</blockquote>
<h2 id="布局模型"><a href="#布局模型" class="headerlink" title="布局模型"></a>布局模型</h2><h3 id="流动模型flow-默认模型"><a href="#流动模型flow-默认模型" class="headerlink" title="流动模型flow(默认模型)"></a>流动模型flow(默认模型)</h3><blockquote>
<ol>
<li>块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布，因为在默认状态下，块状元素的宽度都为100%。实际上，块状元素都会以行的形式占据位置；</li>
<li>内联元素都会在所处的包含元素内从左到右水平分布显示。 </li>
</ol>
</blockquote>
<h3 id="浮动模型float"><a href="#浮动模型float" class="headerlink" title="浮动模型float"></a>浮动模型float</h3><blockquote>
<p>任何元素在默认情况下是不能浮动的，但可以用 CSS 定义为浮动。(让两个块状元素并排显示)<code>float:left;</code></p>
</blockquote>
<h3 id="层模型"><a href="#层模型" class="headerlink" title="层模型"></a>层模型</h3><blockquote>
<ul>
<li>绝对定位<code>position:absolute;</code>：将元素从文档流中拖出来，然后使用left、right、top、bottom属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位。如果不存在这样的包含块，则相对于body元素，即相对于浏览器窗口。</li>
<li>相对定位<code>position:relative;</code>：相对定位完成的过程是首先按static(float)方式生成一个元素(并且元素像层一样浮动了起来)，然后相对于以前的位置移动，移动的方向和幅度由left、right、top、bottom属性确定，偏移前的位置保留不动（即后面的元素是按偏移前所占的区域之后布局的）。</li>
<li>固定定位<code>position:fixed;</code>：与absolute定位类型类似，但它的相对移动的坐标是视图（屏幕内的网页窗口）本身。由于视图本身是固定的，它不会随浏览器窗口的滚动条滚动而变化，除非你在屏幕中移动浏览器窗口的屏幕位置，或改变浏览器窗口的显示大小，因此固定定位的元素会始终位于浏览器窗口内视图的某个位置，不会受文档流动影响。<br>￼</li>
</ul>
</blockquote>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/开疆拓土/">开疆拓土</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/其它/">其它</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-html标签初探" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2019/03/28/html标签初探/" class="article-date">
      <time datetime="2019-03-28T03:32:59.000Z" itemprop="datePublished">2019-03-28</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2019/03/28/html标签初探/">html标签初探</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="常用html标签"><a href="#常用html标签" class="headerlink" title="常用html标签"></a>常用html标签</h2><h3 id="根标签"><a href="#根标签" class="headerlink" title="根标签"></a>根标签</h3><blockquote>
<p><code>&lt;html&gt;&lt;/html&gt;</code> 根标签，所有的网页标签都在<code>&lt;html&gt;&lt;/html&gt;</code>中。</p>
</blockquote>
<h3 id="head标签"><a href="#head标签" class="headerlink" title="head标签"></a>head标签</h3><blockquote>
<p><code>￼&lt;head&gt;&lt;/head&gt;</code> 头部标签，标签用于定义文档的头部，它是所有头部元素的容器。</p>
<ul>
<li><code>￼&lt;title&gt;&lt;/title&gt;</code> 标题标签，网页的标题信息，它会出现在浏览器的标题栏中。</li>
<li><code>￼&lt;link href=&quot;index.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;</code>链接外部样式，rel=”stylesheet” type=”text/css” 是固定写法不可修改。</li>
</ul>
</blockquote>
<h3 id="body标签"><a href="#body标签" class="headerlink" title="body标签"></a>body标签</h3><blockquote>
<p><code>&lt;body&gt;&lt;/body&gt;</code> 主体内容标签，标签之间的内容是网页的主要内容。</p>
<ul>
<li><code>￼&lt;hx&gt;&lt;/hx&gt;</code> 标题标签，一共有6个（h1, h2, h3, h4, h5, h6）</li>
<li><code>&lt;p&gt;&lt;/p&gt;</code> 段落标签</li>
<li><code>&lt;em&gt;&lt;/em&gt;</code> 强调标签，默认斜体展示</li>
<li><code>&lt;strong&gt;&lt;/strong&gt;</code> 强调标签，默认粗体展示</li>
<li><code>&lt;span&gt;&lt;/span&gt;</code> 为文字设置单独样式，不表示强调</li>
<li><code>&lt;q&gt;&lt;/q&gt;</code> 短文本引用，浏览器会自动添加双引号</li>
<li><code>&lt;img src=&quot;图片地址&quot; alt=&quot;下载失败时的替换文本&quot; title=&quot;鼠标滑过时的提示文本&quot;&gt;</code> 图片标签</li>
<li><code>￼&lt;blockquote&gt;&lt;/blockquote&gt;</code> 长文本引用，显示缩进样式</li>
<li><code>￼&lt;address&gt;&lt;/address&gt;</code> 地址标签，为文本加入地址信息，默认斜体</li>
<li><code>&lt;code&gt;&lt;/code&gt;</code> 插入代码，单行</li>
<li><code>￼&lt;pre&gt;&lt;/pre&gt;</code> 插入代码（预格式化的文本），多行，被包围在 pre 元素中的文本通常会保留空格和换行符。</li>
<li><code>&lt;br/&gt;</code> 分行显示，相当于回车换行</li>
<li><code>&lt;hr/&gt;</code> 添加水平横线</li>
<li><code>&lt;ul&gt;&lt;li&gt;信息&lt;/li&gt;&lt;/ul&gt;</code>  ul-li是没有前后顺序的信息列表。默认每项li前都自带一个圆点</li>
<li><code>&lt;ol&gt;&lt;li&gt;信息&lt;/li&gt;&lt;/ol&gt;</code> ol-li是没有前后顺序的信息列表。默认每项li前都自带一个序号，序号默认从1开始</li>
<li><code>&lt;div id=&quot;板块名称&quot;&gt;&lt;/div&gt;</code> 可以把一些独立的逻辑部分划分出来，这个<code>&lt;div&gt;</code>标签的作用就相当于一个容器。用id属性来设定唯一名称。</li>
<li><code>&lt;a href=&quot;目标网址&quot; title=&quot;鼠标滑过显示的文本&quot;&gt;链接显示的文本&lt;/a&gt;</code> 超链接标签 默认在当前浏览器窗口打开。（如果需要再新的窗口打开，可以加上<code>target=&quot;_blank&quot;</code>）</li>
</ul>
</blockquote>
<h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><blockquote>
<ul>
<li><code>&amp;nbsp</code>; 输入空格，表示一个空格</li>
<li>￼注释代码：<code>&lt;!--注释文字--&gt;</code></li>
</ul>
</blockquote>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/开疆拓土/">开疆拓土</a>
    </div>


      
      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-iOS11Safearea" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2018/05/30/iOS11Safearea/" class="article-date">
      <time datetime="2018-05-30T03:24:40.000Z" itemprop="datePublished">2018-05-30</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2018/05/30/iOS11Safearea/">iOS11 SafeArea适配相关</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="safeArea定义"><a href="#safeArea定义" class="headerlink" title="safeArea定义"></a>safeArea定义</h2><p>SafeArea可以看做是系统给所有的view都加上了一个虚拟的view，以这个虚拟view为参考添加的视图对象都能保证不被遮挡而正常显示。</p>
<h2 id="safeArea在不同地方的表现"><a href="#safeArea在不同地方的表现" class="headerlink" title="safeArea在不同地方的表现"></a>safeArea在不同地方的表现</h2><h3 id="UIView中的safeArea"><a href="#UIView中的safeArea" class="headerlink" title="UIView中的safeArea"></a>UIView中的safeArea</h3><p>在iOS11中为view新增了关于safeArea的两个属性和一个方法：</p>
<pre><code>@available(iOS 11.0, *)
open var safeAreaInsets: UIEdgeInsets { get }
@available(iOS 11.0, *)
open var safeAreaLayoutGuide: UILayoutGuide { get }
@available(iOS 11.0, *)
open func safeAreaInsetsDidChange()
</code></pre><blockquote>
<p>safeAreaInsets和safeAreaLayoutGuide均为只可读属性，在进行布局时可以以这两个属性的任意一个作为参考来进行布局</p>
<p>safeAreaInsetsDidChange是在view的safeArea发生改变后触发的方法</p>
</blockquote>
<p><strong>用途：</strong>最常见的在往viewController的view中添加视图对象时以控制器view的safeArea为参照进行布局，就可以良好适配各种情况的界面展示。此处提供一段UIView的类拓展方法，此段代码依赖第三方框架<em>SnapKit</em>。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">import UIKit</div><div class="line">import SnapKit</div><div class="line">public extension UIView &#123;</div><div class="line">    var safeArea: ConstraintBasicAttributesDSL &#123;</div><div class="line">        #if swift(&gt;=3.2)</div><div class="line">        if #available(iOS 11.0, *) &#123;</div><div class="line">            return self.safeAreaLayoutGuide.snp</div><div class="line">        &#125;</div><div class="line">        return self.snp</div><div class="line">        #else</div><div class="line">        return self.snp</div><div class="line">        #endif</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line">使用示例：</div><div class="line">make.top.equalTo(self.view.safeArea.top).offset(20)</div></pre></td></tr></table></figure>
<h3 id="UIViewController中的safeArea"><a href="#UIViewController中的safeArea" class="headerlink" title="UIViewController中的safeArea"></a>UIViewController中的safeArea</h3><p>在iOS11中为UIViewController新增了关于safeArea的一个属性和一个方法：</p>
<pre><code>@available(iOS 11.0, *)
open var additionalSafeAreaInsets: UIEdgeInsets
@available(iOS 11.0, *)
open func viewSafeAreaInsetsDidChange()
</code></pre><blockquote>
<p>additionalSafeAreaInsets主要是用在自定义navigationBar、tabBar或是需要为界面留空时使用，修改控制器的该参数会影响控制器根视图view的safeArea</p>
<p>viewSafeAreaInsetsDidChange在控制器根视图的safeArea发生改变后触发</p>
</blockquote>
<p><strong>示例：</strong></p>
<p>self.additionalSafeAreaInsets = UIEdgeInsetsMake(20, 20, 20, 20)</p>
<p><img src="/2018/05/30/iOS11Safearea/1.jpg" alt=""></p>
<h3 id="其他地方的safeArea"><a href="#其他地方的safeArea" class="headerlink" title="其他地方的safeArea"></a>其他地方的safeArea</h3><p>ScrollView、TableView、CollectionView都有一些与safeArea相关的新属性或方法，但只要在将这些view添加到控制器的根视图中时做了safeArea的适配，一般就不需要进行额外的处理，故此处不再做探讨。</p>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/术业专攻/">术业专攻</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/总结/">总结</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-Efficiency-XcodeTemplate" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2017/03/28/Efficiency-XcodeTemplate/" class="article-date">
      <time datetime="2017-03-28T09:07:37.000Z" itemprop="datePublished">2017-03-28</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/03/28/Efficiency-XcodeTemplate/">高效工作--自定义Xcode类模板</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="自定义模板的意义"><a href="#自定义模板的意义" class="headerlink" title="自定义模板的意义"></a>自定义模板的意义</h2><p>码字<strong>更快</strong>、逼格<strong>更高</strong>、逻辑<strong>更强</strong></p>
<blockquote>
<p><img src="/2017/03/28/Efficiency-XcodeTemplate/show.gif" alt="showTime"></p>
</blockquote>
<h2 id="自定义一个模板类"><a href="#自定义一个模板类" class="headerlink" title="自定义一个模板类"></a>自定义一个模板类</h2><p>系统模板所在路径：</p>
<blockquote>
<p><code>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates</code></p>
</blockquote>
<p>我们可以看到文件夹内有如下文件：<br><img src="/2017/03/28/Efficiency-XcodeTemplate/1.png" alt="模板文件夹"><br>点开Source文件夹：<br><img src="/2017/03/28/Efficiency-XcodeTemplate/2.png" alt="Source文件夹"><br>然后我们对比Xcode新建文件夹的窗口：<br><img src="/2017/03/28/Efficiency-XcodeTemplate/3.png" alt="新建文件窗口"></p>
<blockquote>
<p>结论：模板文件夹内的内容对应红色圈出的单元；Source文件夹内对应的是黄色圈出的单元</p>
</blockquote>
<h3 id="先构建一个自定义的分类"><a href="#先构建一个自定义的分类" class="headerlink" title="先构建一个自定义的分类"></a>先构建一个自定义的分类</h3><p>将我们最常用的<code>Cocoa Touch Class.xctemplate</code>文件夹内的内容复制一份到桌面并修改文件夹命名。此处我命名为<code>WeiFuZi.xctemplate</code>。</p>
<blockquote>
<p>重新写一个模板太难太难，我们也就自己改改现有的就好了!!!<br>注意修改模板文件夹内的内容都是要进行身份鉴定，即输入账户密码。我们可以修改完再直接拉到系统模板所在的文件夹</p>
</blockquote>
<h3 id="修改自定义的分类"><a href="#修改自定义的分类" class="headerlink" title="修改自定义的分类"></a>修改自定义的分类</h3><ul>
<li>打开<code>WeiFuZi.xctemplate</code>文件夹</li>
<li>替换<code>TemplateIcon</code>文件，这个地方是修改这个分类在新建类文件时所用的icon。用对应原图尺寸的图片，并改为相同的名字就行了。</li>
<li>找到<code>UIViewControllerSwift</code>文件夹打开，修改里面的内容。<em>可以发现里面的文件都是一一对应的，如<code>UIViewControllerSwift</code>和<code>UIViewControllerObjective-C</code>就分别对应<code>UIViewController</code>的Swift模板和Objective-C模板</em></li>
<li>打开<code>___FILEBASENAME___.swift</code>文件，对照它和新创建的文件，就可以知道每个字段对应的意思。这里我将它修改成这样：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line">//</div><div class="line">//  ___FILENAME___</div><div class="line">//  </div><div class="line">//  QQ: 785850983</div><div class="line">//  Blog: http://weifuzi.oschina.io</div><div class="line">//</div><div class="line">//  Created by ___FULLUSERNAME___ on ___DATE___.</div><div class="line">//___COPYRIGHT___</div><div class="line">//</div><div class="line"></div><div class="line">import UIKit</div><div class="line"></div><div class="line">class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ &#123;</div><div class="line"></div><div class="line">    // MARK: Property</div><div class="line">    </div><div class="line">    // MARK: LifeCycle</div><div class="line">    override func viewDidLoad() &#123;</div><div class="line">        super.viewDidLoad()</div><div class="line"></div><div class="line">    &#125;</div><div class="line">    </div><div class="line">    // MARK: Method</div><div class="line">    </div><div class="line">    // MARK: Action</div><div class="line">    </div><div class="line">&#125;</div><div class="line"></div><div class="line">// MARK: Extension</div><div class="line">extension ___FILEBASENAMEASIDENTIFIER___ &#123;</div><div class="line">    </div><div class="line">&#125;</div><div class="line"></div><div class="line">// MARK: Delegate</div></pre></td></tr></table></figure>
<p>到此我们已经完成了基本的模板的自定义</p>
<ul>
<li>将修改的的模板文件夹<code>WeiFuZi.xctemplate</code>放置到系统模板所在的位置。<br><img src="/2017/03/28/Efficiency-XcodeTemplate/7.png" alt="模板文件放置"></li>
</ul>
<blockquote>
<p>Tips:我们在编程时自定义的子类，在新建继承自这个子类的文件时总是不能自动联想出来，这是因为没有配置这个类的索引。</p>
<p>我们回到<code>WeiFuZi.xctemplate</code>文件夹内找到<code>TemplateInfo.plist</code>文件，这是模板的配置文件，我们可以打开配置子类的索引。只要将要联想的类名添加的文件中标记的位置就行了。<br>另外<code>Values</code>下方的<code>Suffixes</code>是配置默认后缀的，点开你就会懂的。</p>
<p>最后要注意：在plist文件里面添加了的子类要有对应的模板文件，不然无法成功创建对应新文件哦！！！<br><img src="/2017/03/28/Efficiency-XcodeTemplate/8.png" alt="修改plist文件"></p>
</blockquote>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/术业专攻/">术业专攻</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/键码如飞/">键码如飞</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-iOS-summary" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2017/02/08/iOS-summary/" class="article-date">
      <time datetime="2017-02-08T06:07:11.000Z" itemprop="datePublished">2017-02-08</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/02/08/iOS-summary/">iOS知识总结&lt;一&gt;</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h3 id="在Archive项目时，出现了“Your-build-settings-specify-a-provisioning-profile-with-the-UUID-“”-however-no-such-provisioning-profile-was-found”的出错。"><a href="#在Archive项目时，出现了“Your-build-settings-specify-a-provisioning-profile-with-the-UUID-“”-however-no-such-provisioning-profile-was-found”的出错。" class="headerlink" title="在Archive项目时，出现了“Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning profile was found”的出错。"></a>在Archive项目时，出现了“Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning profile was found”的出错。</h3><ol>
<li>找到项目中的**.xcodeproj文件，点击右键，show package contents(打开包内容)。打开后找到project.pbxproj文件，用文本编辑器打开。其实就是右键，点击open就好了。</li>
<li>打开这个文件后，按command+F，在这个文件中查找“PROVISIONING_PROFILE”,找到和这个类似的都删除然后保存文件，重新打开项目</li>
</ol>
<h3 id="只在debug模式打印NSLog"><a href="#只在debug模式打印NSLog" class="headerlink" title="只在debug模式打印NSLog"></a>只在debug模式打印NSLog</h3><p>打开project–&gt;Build setting选项，在下面找LLVM GCC4.2-preprocessing下面的－preprocessor macros  下一级 Debug中设置DEBUG＝1或$(inherited)<br>在pch文件中</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">#ifdef DEBUG</div><div class="line">     #else</div><div class="line">     #define NSLog(...)&#123;&#125;;</div><div class="line">     #endif</div></pre></td></tr></table></figure>
<h3 id="设置应用的本地化语言"><a href="#设置应用的本地化语言" class="headerlink" title="设置应用的本地化语言"></a>设置应用的本地化语言</h3><p>踩过个坑，上传到AppStore的应用，应用描述里的语言项始终不能如意，其实是没有在应用的info.plist文件配置</p>
<blockquote>
<p>选择工程的plist文件设置Localization native development region为所需要的语言</p>
</blockquote>
<h3 id="解决NSTimer因控件滚动而停止"><a href="#解决NSTimer因控件滚动而停止" class="headerlink" title="解决NSTimer因控件滚动而停止"></a>解决NSTimer因控件滚动而停止</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];</div></pre></td></tr></table></figure>
<h3 id="UILabel设置行间距及主动换行和居中"><a href="#UILabel设置行间距及主动换行和居中" class="headerlink" title="UILabel设置行间距及主动换行和居中"></a>UILabel设置行间距及主动换行和居中</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:@&quot;发布第一张图为商品封面\n最多可以上传8张图片&quot;];</div><div class="line">NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];</div><div class="line">[paragraphStyle setLineSpacing:8.5 * BIAOZHUN];</div><div class="line">paragraphStyle.alignment = NSTextAlignmentCenter;</div><div class="line">[attributedStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, attributedStr.length)];</div><div class="line">label.attributedText = attributedStr;</div><div class="line">label.numberOfLines = 2;</div></pre></td></tr></table></figure>
<h3 id="Label或UIButton下划线"><a href="#Label或UIButton下划线" class="headerlink" title="Label或UIButton下划线"></a>Label或UIButton下划线</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@&quot;下次再说&quot;];</div><div class="line">[str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, str.length)];</div></pre></td></tr></table></figure>
<h3 id="多次移除观察者导致程序崩溃解决方法"><a href="#多次移除观察者导致程序崩溃解决方法" class="headerlink" title="多次移除观察者导致程序崩溃解决方法"></a>多次移除观察者导致程序崩溃解决方法</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">1）@try &#123;[_progress removeObserver:self forKeyPath:@&quot;completedUnitCount&quot;];&#125;</div><div class="line">         @catch (NSException *exception) &#123; NSLog(@&quot;多次删除了&quot;);&#125;</div><div class="line">2）给是否移除做上标记</div></pre></td></tr></table></figure>
<h3 id="UICollectionView不执行viewForSupplementaryElementOfKind方法"><a href="#UICollectionView不执行viewForSupplementaryElementOfKind方法" class="headerlink" title="UICollectionView不执行viewForSupplementaryElementOfKind方法"></a>UICollectionView不执行viewForSupplementaryElementOfKind方法</h3><p>要先实现UICollectionViewDelegateFlowLayout协议里的<code>func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int)</code></p>
<h3 id="跳转到AppStore的APP网络路径"><a href="#跳转到AppStore的APP网络路径" class="headerlink" title="跳转到AppStore的APP网络路径"></a>跳转到AppStore的APP网络路径</h3><blockquote>
<p><a href="http://itunes.apple.com/app/id(your" target="_blank" rel="external">http://itunes.apple.com/app/id(your</a> apple id)</p>
</blockquote>
<h3 id="NSAssert-函数使用"><a href="#NSAssert-函数使用" class="headerlink" title="NSAssert()函数使用"></a>NSAssert()函数使用</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">NSAssert(x!=0,@&quot;x must be zero&quot;);</div></pre></td></tr></table></figure>
<p>在表达式“x!=0”不成立时，程序就会抛出异常，并显示自定义的消息”x must be zero”，并同时显示出错的文件、代码和调用函数等信息，是一个程序追踪的很好手段。 假设x!=0，不满足要求就提示reason-x must not be zero;</p>
<h3 id="程序后台运行一段时间"><a href="#程序后台运行一段时间" class="headerlink" title="程序后台运行一段时间"></a>程序后台运行一段时间</h3><p>当应用按Home键退出后，应用仅有最多5秒钟的时间做一些保存和清理资源的工作。但是应用可以调用UIApplication的 beginBackgroundTaskWithExpirationHandler方法，让应用最多有10分钟的时间在后台长久运行。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">//AppDelegate.h文件</div><div class="line">    @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundUpdateTask;</div><div class="line"></div><div class="line">//AppDelegate.m文件</div><div class="line">- (void)applicationDidEnterBackground:(UIApplication *)application &#123;</div><div class="line">  self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^&#123;</div><div class="line">     [self endBackgroundUpdateTask];</div><div class="line"> &#125;];</div><div class="line"> </div><div class="line">	//在这里加上需要执行的操作</div><div class="line"></div><div class="line">    [self endBackgroundUpdateTask];</div><div class="line">&#125;</div><div class="line"></div><div class="line">- (void)endBackgroundUpdateTask&#123;</div><div class="line">   [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];</div><div class="line">   self.backgroundUpdateTask = UIBackgroundTaskInvalid;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="配置pch文件"><a href="#配置pch文件" class="headerlink" title="配置pch文件"></a>配置pch文件</h3><blockquote>
<ol>
<li>新建文件-&gt;other-&gt;pchfile</li>
<li>build Settings-&gt;搜索prefix-&gt;Prefix Header中添加路径$(SRCROOT)/文件名.pch</li>
</ol>
</blockquote>
<h3 id="限制TextView或TextField的输入字数-textView只走第二步，有代理方法"><a href="#限制TextView或TextField的输入字数-textView只走第二步，有代理方法" class="headerlink" title="限制TextView或TextField的输入字数(textView只走第二步，有代理方法)"></a>限制TextView或TextField的输入字数(textView只走第二步，有代理方法)</h3><ul>
<li>添加监听</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:_goodsNameTF];</div></pre></td></tr></table></figure>
<ul>
<li>实现监听方法</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">- (void)textFieldChanged:(NSNotification *)obj&#123;</div><div class="line">    UITextField *textField = (UITextField *)obj.object;</div><div class="line">    NSInteger kMaxLength = 20;</div><div class="line"></div><div class="line">    NSString *toBeString = textField.text;</div><div class="line">    NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式</div><div class="line">    if ([lang isEqualToString:@&quot;zh-Hans&quot;]) &#123; // 简体中文输入，包括简体拼音，健体五笔，简体手写</div><div class="line">        //获取高亮部分</div><div class="line">        UITextRange *selectedRange = [textField markedTextRange];</div><div class="line">        // 没有高亮选择的字，则对已输入的文字进行字数统计和限制</div><div class="line">        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];</div><div class="line">        if (!position) &#123;</div><div class="line">            if (toBeString.length &gt; kMaxLength) &#123;</div><div class="line">                textField.text = [toBeString substringToIndex:kMaxLength];</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">        // 有高亮选择的字符串，则暂不对文字进行统计和限制</div><div class="line">        else&#123;</div><div class="line"></div><div class="line">        &#125;</div><div class="line">    &#125;else&#123;// 中文输入法以外的直接对其统计限制即可，不考虑其他语种情况</div><div class="line">        if (toBeString.length &gt; kMaxLength) &#123;</div><div class="line">            textField.text = [toBeString substringToIndex:kMaxLength];</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ul>
<li>在dealloc里注销监听</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:_goodsNameTF];</div></pre></td></tr></table></figure>
<h3 id="CABasicAnimation如何让多个动画顺序执行"><a href="#CABasicAnimation如何让多个动画顺序执行" class="headerlink" title="CABasicAnimation如何让多个动画顺序执行"></a>CABasicAnimation如何让多个动画顺序执行</h3><p>只需要在后面的动画中设置：<code>animation(对象).beginTime = CACurrentMediaTime() + 0.2;</code>(前一个动画所需时间)</p>
<h3 id="扫码全屏显示设置扫描区域"><a href="#扫码全屏显示设置扫描区域" class="headerlink" title="扫码全屏显示设置扫描区域"></a>扫码全屏显示设置扫描区域</h3><p>设置AVCaptureMetadataOutput的rectOfInterest的属性：CGRectMake（y的起点/屏幕的高，x的起点/屏幕的宽，扫描的区域的高/屏幕的高，扫描的区域的宽/屏幕的宽）</p>
<h3 id="设置collectionView的cell点击高亮效果"><a href="#设置collectionView的cell点击高亮效果" class="headerlink" title="设置collectionView的cell点击高亮效果"></a>设置collectionView的cell点击高亮效果</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath           *)indexPath&#123;</div><div class="line">    return YES;</div><div class="line">&#125;</div><div class="line">- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath&#123;</div><div class="line">    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];</div><div class="line">    [cell setBackgroundColor:[UIColor colorWithHexString:@&quot;#dcdcdc&quot;]];</div><div class="line">&#125;</div><div class="line">- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath&#123;</div><div class="line">    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];</div><div class="line">    [UIView animateWithDuration:0.4 animations:^&#123;</div><div class="line">        [cell setBackgroundColor:[UIColor whiteColor]];</div><div class="line">    &#125;];</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="设置StatusBar"><a href="#设置StatusBar" class="headerlink" title="设置StatusBar"></a>设置StatusBar</h3><ul>
<li>方法一：全局控制StatusBar<ol>
<li>在项目的Info.plist文件里设置UIViewControllerBasedStatusBarAppearance为NO。（默认为yes）</li>
<li>使用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];方法设置颜色。</li>
</ol>
</li>
<li><p>方法二：基于控制器的方式控制StatusBar</p>
<ol>
<li>在项目的Info.plist文件里设置UIViewControllerBasedStatusBarAppearance为YES。</li>
<li>在各个UIViewController里分别控制状态栏的颜色和状态。</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">- (UIStatusBarStyle)preferredStatusBarStyle&#123;&#125;</div><div class="line">- (BOOL)prefersStatusBarHidden&#123;&#125;</div><div class="line">*[self setNeedsStatusBarAppearanceUpdate];可以调起(UIStatusBarStyle)preferredStatusBarStyle动态改变状态栏*</div></pre></td></tr></table></figure>
</li>
</ul>
<h3 id="UILabel显示html文本"><a href="#UILabel显示html文本" class="headerlink" title="UILabel显示html文本"></a>UILabel显示html文本</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">NSString * htmlString = @&quot;&lt;html&gt;&lt;body&gt; Some html string \n &lt;font size=\&quot;13\&quot; color=\&quot;red\&quot;&gt;This is some text!&lt;/font&gt; &lt;/body&gt;&lt;/html&gt;&quot;;</div><div class="line">NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@&#123; NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType &#125; documentAttributes:nil error:nil];</div><div class="line">UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];</div><div class="line">myLabel.attributedText = attrStr;</div><div class="line">[self.view addSubview:myLabel];</div></pre></td></tr></table></figure>
<h3 id="获取相机权限"><a href="#获取相机权限" class="headerlink" title="获取相机权限"></a>获取相机权限</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">#import &lt;AVFoundation/AVFoundation.h&gt;</div><div class="line">AVAuthorizationStatus authorStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];</div><div class="line">if (authorStatus != 3) &#123;</div><div class="line">    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) &#123;</div><div class="line">    </div><div class="line">    &#125;];</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="xcode的证书存储路径"><a href="#xcode的证书存储路径" class="headerlink" title="xcode的证书存储路径"></a>xcode的证书存储路径</h3><p><code>~/Library/MobileDevice/Provisioning Profiles</code></p>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/术业专攻/">术业专攻</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/总结/">总结</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-interview" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2017/02/06/interview/" class="article-date">
      <time datetime="2017-02-06T06:48:44.000Z" itemprop="datePublished">2017-02-06</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/02/06/interview/">iOS问题总结&lt;二&gt;</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h3 id="类扩展和分类的区别"><a href="#类扩展和分类的区别" class="headerlink" title="类扩展和分类的区别"></a>类扩展和分类的区别</h3><blockquote>
<ul>
<li>类扩展没有名字,分类有名字</li>
<li>类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩展方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明</li>
</ul>
</blockquote>
<h3 id="UIView的frame和bounds的区别"><a href="#UIView的frame和bounds的区别" class="headerlink" title="UIView的frame和bounds的区别"></a>UIView的frame和bounds的区别</h3><blockquote>
<ul>
<li>frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点.</li>
<li>bounds表示的是控件矩形框的位置和尺寸,是以自己的左上角为坐标原点.</li>
</ul>
</blockquote>
<h3 id="引用资源的时候每个选项的含义"><a href="#引用资源的时候每个选项的含义" class="headerlink" title="引用资源的时候每个选项的含义"></a>引用资源的时候每个选项的含义</h3><blockquote>
<ul>
<li>copy:勾选copy,会把资源拷贝一份到项目的文件夹中(建议勾选,因为这样修改项目中的资源不会影响源资源)</li>
<li>Added folder:如果勾选Create groups,只会会创建一个虚拟的文件夹,程序打包后,安装包中不存在这个文件夹;如果勾选Create folder references,真的创建一个文件夹,程序打包后,安装包中真的有这个文件夹.</li>
<li>Add to targets:要不要把资源打包到软件安装包中去.一定要勾选,不勾选到时候程序打包后,安装包中没有这个资源.</li>
</ul>
</blockquote>
<h3 id="iOS中imageNamed和imageWithContentOfFile的区别"><a href="#iOS中imageNamed和imageWithContentOfFile的区别" class="headerlink" title="iOS中imageNamed和imageWithContentOfFile的区别"></a>iOS中imageNamed和imageWithContentOfFile的区别</h3><p><strong>Images.xcassets中的图片资源只能通过imageNamed:方法加载</strong></p>
<blockquote>
<ul>
<li>imageNamed：返回的对象会保存在缓存中，只有退出程序才会释放内存，但下一次调用很快，直接从缓存中读取即可。</li>
<li>imageWithContentOfFile：返回的对象不会保存在缓存中，一旦对象销毁就会释放内存。</li>
<li>结论: 如果图片较小，并且频繁使用的图片，使用imageName:来加载图片(按钮图片/主页图片/占位图)；如果图片较大，并且使用次数较少，使用imageWithContentOfFile:来加载(相册/版本新特性)。</li>
</ul>
</blockquote>
<h3 id="instancetype和id的区别"><a href="#instancetype和id的区别" class="headerlink" title="instancetype和id的区别"></a>instancetype和id的区别</h3><p>两个都可以代表任意类型，但是instancetype只能作为返回值使用且会类型检测，id可以作为返回值、参数也可以定义变量，不会进行类型检测</p>
<h3 id="通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame-方法中做吗"><a href="#通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame-方法中做吗" class="headerlink" title="通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame:方法中做吗?"></a>通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame:方法中做吗?</h3><p>如果是通过xib或者storyboard创建控件，初始化时是不会调用initWithFrame,会调用initWithCoder.初始化完毕会调用awakeFromNib方法,建议在awakeFromNib中做初始化</p>
<h3 id="计算一段文字的宽度和高度"><a href="#计算一段文字的宽度和高度" class="headerlink" title="计算一段文字的宽度和高度"></a>计算一段文字的宽度和高度</h3><blockquote>
<ul>
<li>如果文字只有一行,通过sizeWithAttributes:这个方法,告知这段文字的字体和字体大小就可以计算这段文字的尺寸.</li>
<li>如果文字需要换行计算高度,通过boundingRectWithSize: options: attributes:attributes context: 这个方法,告知这段文字的字体和字体大小,并且在一个限制的尺寸内计算这段文字的尺寸.</li>
</ul>
<p><code>两者都是NSString类的方法，Swift中需要将String转化为NSString后调用</code></p>
</blockquote>
<h3 id="makeKeyAndVisible做了哪些事情"><a href="#makeKeyAndVisible做了哪些事情" class="headerlink" title="makeKeyAndVisible做了哪些事情"></a>makeKeyAndVisible做了哪些事情</h3><blockquote>
<ul>
<li>让窗口成为显示状态.</li>
<li>把根控制器的View添加到窗口上面.</li>
<li>把当前窗口设置成应用程序的主窗口.</li>
</ul>
</blockquote>
<h3 id="程序启动流程"><a href="#程序启动流程" class="headerlink" title="程序启动流程"></a>程序启动流程</h3><p>一个程序从main函数开始启动</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">int main(int argc, char * argv[]) &#123;</div><div class="line">    @autoreleasepool &#123;</div><div class="line">        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>可以看到main函数会调用UIApplicationMain函数，它的四个参数的意思是：</p>
<blockquote>
<ul>
<li>argc: 代表程序在进入main函数时的参数的个数。默认为1。</li>
<li>argv: 代表包含的各个参数。默认为程序的名字。</li>
<li>principalClassName: UIApplication或者它的子类的名字, 如果传入的是nil, 则表示UIApplication的名字, 即@”UIApplication”。</li>
<li>delegateClassName: UIApplication的代理的名字。</li>
</ul>
</blockquote>
<p>在UIApplicationMain函数中，根据传入的UIApplication名称和它的代理的名称，会主要做下面的事情：</p>
<blockquote>
<ol>
<li>根据传入的名称创建UIApplication对象。</li>
<li>根据传入的代理名称创建UIApplication代理对象。</li>
<li>开启事件循环（如果不进行循环，那么在main函数结束后程序就结束了。要保证程序创建后可以一直存在）。</li>
<li>解析Info.plist文件：会在Info.plist文件里查找Main storyboard file base name这个Key对应的Value是否有值。如果有值，则表示之后会通过Storyboard加载控制器，AppDelegate会接收到didFinishLaunchingWithOptions消息（程序启动完成的时候），此时Storyboard会进行一系列的加载操作；如果没有值，则不会通过Storyboard加载控制器，接着AppDelegate会接收到didFinishLaunchingWithOptions消息（程序启动完成的时候），在这个时候需要我们通过代码的方式加载控制器。</li>
</ol>
</blockquote>
<p>通过代码的方式，需要我们在didFinishLaunchingWithOptions方法中进行加载控制器的相关操作:（通过Storyboard也会执行类似的操作）</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions &#123;</div><div class="line">    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];</div><div class="line">    UIViewController *viewController = [[UIViewController alloc] init];</div><div class="line">    self.window.rootViewController = viewController;</div><div class="line">    // 此时根控制器的view还没有加到self.window上</div><div class="line">    [self.window makeKeyAndVisible];</div><div class="line">    //修改self.window的hidden为NO，将根控制器的view加到self.window上</div><div class="line">    return YES;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="控制器中LoadView-的作用以及使用LoadView的注意点"><a href="#控制器中LoadView-的作用以及使用LoadView的注意点" class="headerlink" title="控制器中LoadView()的作用以及使用LoadView的注意点"></a>控制器中LoadView()的作用以及使用LoadView的注意点</h3><p>控制器调用LoadView：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">if 控制器是从StoryBoard中加载的 &#123;</div><div class="line"> 	从StoryBoard当中加载控制器的View</div><div class="line">&#125;else if 控制器是从Xib中加载的 &#123;</div><div class="line"> 	从xib加载控制器的View</div><div class="line">&#125;else &#123;</div><div class="line"> 	创建一个空的UIView设为当前控制器的View</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><strong>注意：</strong></p>
<blockquote>
<ul>
<li>一旦重写了loadView,表示需要自己创建控制器的View.</li>
<li>如果控制器的View还没有赋值,就不能调用控制器View的get方法.会造成死循环.因为控制器View的get方法底层会调用loadView方法.</li>
</ul>
</blockquote>
<h3 id="KVC的底层实现逻辑"><a href="#KVC的底层实现逻辑" class="headerlink" title="KVC的底层实现逻辑"></a>KVC的底层实现逻辑</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[flagItem setValue:obj forKeyPath:key];</div></pre></td></tr></table></figure>
<p>拿字符串与当前类的属性进行匹配.如果匹配到,就给该属性赋值. </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">if 有跟key值相同名称的set方法 &#123;</div><div class="line">	调用set方法,把obj传入</div><div class="line">&#125;else if 存在相同名称,并且带有下划线的成员属性 &#123;</div><div class="line">	给该属性赋值</div><div class="line">&#125;else if 存在跟它相同名称的成员属性 &#123;</div><div class="line">	给该属性赋值</div><div class="line">&#125;else &#123;</div><div class="line">if 实现了 setValue:(id)value forUndefinedKey: &#123;</div><div class="line">		调用</div><div class="line">	&#125;else &#123;</div><div class="line">		报错</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="多线程技术的优缺点"><a href="#多线程技术的优缺点" class="headerlink" title="多线程技术的优缺点"></a>多线程技术的优缺点</h3><ul>
<li>优点：能够提高程序的执行效率和资源（CPU、内存等）的利用率</li>
<li>缺点：<ol>
<li>程序代码更加复杂、增加调试难度</li>
<li>创建线程会有额外开销，如果大量开启线程反而会降低程序的性能</li>
</ol>
</li>
</ul>
<h3 id="线程和进程是什么？它们之间有什么关系？"><a href="#线程和进程是什么？它们之间有什么关系？" class="headerlink" title="线程和进程是什么？它们之间有什么关系？"></a>线程和进程是什么？它们之间有什么关系？</h3><ul>
<li>进程是CPU调度和分配资源的单位；线程是CPU可识别的最小执行和调度单位。</li>
<li>关系：<ol>
<li>进程包含线程，同一个进程内的线程共享进程的资源</li>
<li>一个程序可以对应多个进程，一个进程中可以有多个线程，但每个进程至少要有一个线程；</li>
</ol>
</li>
</ul>
<h3 id="图片二级缓存的实现思路"><a href="#图片二级缓存的实现思路" class="headerlink" title="图片二级缓存的实现思路"></a>图片二级缓存的实现思路</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">if 存在内存缓存 &#123;</div><div class="line">	直接使用</div><div class="line">&#125;else &#123;</div><div class="line">	if 存在磁盘缓存 &#123;</div><div class="line">		保存一份到内存缓存</div><div class="line">		使用</div><div class="line">	&#125;else &#123;</div><div class="line">		下载图片</div><div class="line">		保存一份到内存缓存</div><div class="line">		保存一份到磁盘缓存</div><div class="line">		使用</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="相对于GCD而言，操作队列-NSOperation和NSOperationQueue-的优势"><a href="#相对于GCD而言，操作队列-NSOperation和NSOperationQueue-的优势" class="headerlink" title="相对于GCD而言，操作队列(NSOperation和NSOperationQueue)的优势"></a>相对于GCD而言，操作队列(NSOperation和NSOperationQueue)的优势</h3><p><strong>GCD是纯C语言的API,而操作队列则是Object-C的对象。</strong>如果只是想简单开一个子线程执行任务推荐使用GCD，如果有很多任务需要开多个子线程下载推荐使用操作队列。</p>
<p><strong>优势：</strong></p>
<blockquote>
<ol>
<li>NSOperationQueue可以方便的调用cancel方法来取消某个操作，而GCD中的任务是无法被取消的（安排好任务之后就不管了）。</li>
<li>NSOperation可以方便的指定操作间的依赖关系。</li>
<li>NSOperation可以通过KVO提供对NSOperation对象的精细控制（如监听当前操作是否被取消或是否已经完成等）。</li>
<li>NSOperation可以方便的指定操作优先级。操作优先级表示此操作与队列中其它操作之间的优先关系，优先级高的操作先执行，优先级低的后执行。</li>
<li>通过自定义NSOperation的子类可以实现操作重用。</li>
</ol>
</blockquote>
<h3 id="手势及事件的传递机理"><a href="#手势及事件的传递机理" class="headerlink" title="手势及事件的传递机理"></a>手势及事件的传递机理</h3><blockquote>
<ol>
<li><p>确定事件所在的View：当用户触摸时，UIKit先创建一个事件对象，加到事件队列中，然后UIApplication从中取出来，然后来确定事件所在的View。</p>
<blockquote>
<p>首先让window调用<code>hitTest:withEvent:</code>方法，它会遍历自身的subView，如果view的userInteractionEnabled为NO或者view是隐藏的或者view的alpha小于0.01时，返回空指针，否则调用<code>hitTest:withEvent:</code>来判断事件是否发生在自己的区域内，如果返回true则调用自身(subView)的<code>hitTest:withEvent:</code>。如此循环直到找到最顶端的View。</p>
</blockquote>
</li>
<li><p>根据获得的最顶端的View通过nextResponder得到响应链：UIViewB —&gt; superViewA —&gt; UIViewControlA —&gt; rootView —&gt; rootViewController —&gt; window —&gt; UIApplication —&gt; AppDelegate</p>
</li>
<li>传递手势：<blockquote>
<ol>
<li>每次传递其中有一个，它会从事件链的最前面开始传递，先将event传递给事件链顶部的View的手势们。然后看有没有识别的，如果没有就继续到下一个响应者的手势们，如果识别，那么就停止传递。如果传递了整个链，还没有发现有识别的，事件会回到链的最前端，然后开始找第一个实现touch（touchbegin，touchend，等等）的view进行识别，然后停止本次传递。</li>
<li>从事件中再取出一个，继续进行一过程。最终到没有事件为止。</li>
</ol>
</blockquote>
</li>
</ol>
</blockquote>
<h3 id="include与-import的区别、-import与-class的区别"><a href="#include与-import的区别、-import与-class的区别" class="headerlink" title="#include与#import的区别、#import与@class的区别"></a>#include与#import的区别、#import与@class的区别</h3><ul>
<li>面向对象#include与#import效果相同，只是后者不会引起交叉编译，确保头文件只会被导入一次</li>
<li>import会包含类的所有信息，包括实体变量和方法，而@class只是告诉编译器，其后面声明的名称是类的名称，至于这些类是如何定义的，暂时不用考虑。</li>
</ul>
<h3 id="内存中堆区和栈区的区别"><a href="#内存中堆区和栈区的区别" class="headerlink" title="内存中堆区和栈区的区别"></a>内存中堆区和栈区的区别</h3><p>堆区一般由程序员分配和释放，若程序员不释放，则内存溢出；栈区由编译器自动分配释放，存放方法的参数值，局部变量的值等。</p>
<h3 id="ViewController各方法的调用时机"><a href="#ViewController各方法的调用时机" class="headerlink" title="ViewController各方法的调用时机"></a>ViewController各方法的调用时机</h3><ul>
<li>loadView：当控制器的根视图view为空，且此view被访问时调用</li>
<li>viewDidLoad：loadView调用之后调用</li>
<li>viewWillAppear：当控制器根视图被添加到父视图上时调用</li>
<li>viewDidUnload：iOS6之前，当内存警告时，先卸载试图，再调用viewDidUnload来释放内存</li>
</ul>
<h3 id="理解delegate"><a href="#理解delegate" class="headerlink" title="理解delegate"></a>理解delegate</h3><p>delegate又称为委托或代理，它是一种设计模式。delegate主要用于两个对象之间的通信交互，并且解除两个通信对象的耦合性，iOS中大量使用了delegate设计，主要用于视图与使用对象之间的通信交互。</p>
<h3 id="栈结构和队列的区别"><a href="#栈结构和队列的区别" class="headerlink" title="栈结构和队列的区别"></a>栈结构和队列的区别</h3><p>栈是限定只能在表的一端进行插入和删除操作的线性表（先进后出）；队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表（先进先出）。队列遍历数据的速度要快得多。</p>
<h3 id="TCP与UDP的区别"><a href="#TCP与UDP的区别" class="headerlink" title="TCP与UDP的区别"></a>TCP与UDP的区别</h3><ul>
<li>TCP全称为传输控制协议，是面向连接的、可靠、有序、无界、速度慢、开销大、有拥塞控制的协议；</li>
<li>UDP全称为用户数据报协议，是无连接的、不可靠、无序、有界、速度快、开销小、无拥塞控制的协议。</li>
</ul>
<h3 id="TCP连接的三次握手"><a href="#TCP连接的三次握手" class="headerlink" title="TCP连接的三次握手"></a>TCP连接的三次握手</h3><blockquote>
<ol>
<li>客户端发送syn包（syn=j）到服务器，并进入SYN_SEND状态，等待服务器确认；</li>
<li>服务器收到syn包，必须确认客户的SYN（syn=j+1），同时自己也发送一个syn包（syn=k），即SYN+ACK包，此时服务器进入SYN_RECV状态；</li>
<li>客户端收到服务器的SYN+ACK包，向服务器发送确认包ACK（ack=k+1），此包发送完毕，客户端和服务器端进入ESTABLISHED状态，完成三次握手。</li>
</ol>
</blockquote>
<h3 id="socket建立网络连接的步骤"><a href="#socket建立网络连接的步骤" class="headerlink" title="socket建立网络连接的步骤"></a>socket建立网络连接的步骤</h3><p>建立socket连接至少需要一对套接字，其中一个运行于客户端（ClientSocket），另一个运行于服务器端（ServerSocket）。连接过程：</p>
<blockquote>
<ol>
<li>服务器监听：服务器套接字并不定位具体的客户端套接字，而是处于等待连接的状态，实时监控网络状态，等待客户端的连接请求；</li>
<li>客户端请求：客户端的套接字提出连接请求，要连接的目标是服务器端的套接字。（客户端的套接字必须首先描述它要连接的服务器的套接字，指出服务器端套接字的地址和端口号，然后向服务器端套接字提出连接请求）</li>
<li>连接确认：当服务器端套接字监听到或者说接收到客户端套接字的连接请求时，就响应客户端套接字的请求，建立一个新的线程，把服务器端套接字的描述发给客户端，一旦客户端确认了此描述，双方就正式建立连接。</li>
</ol>
</blockquote>
<h3 id="优化UITableView的滑动速度"><a href="#优化UITableView的滑动速度" class="headerlink" title="优化UITableView的滑动速度"></a>优化UITableView的滑动速度</h3><ul>
<li>复用单元格，文字、图片直接用drawInRect绘制；</li>
<li>使用不透明的视图，单元格中尽量少使用动画；</li>
<li>滑动时不加载图片，停止滑动开始加载。图片加载使用异步加载，并且限制图片加载的并发数；</li>
<li>cell高度固定的话直接用cell.rowHeight设置高度，如果cell是动态行高，计算出高度后缓存。</li>
</ul>
<h3 id="对Runloop的理解"><a href="#对Runloop的理解" class="headerlink" title="对Runloop的理解"></a>对Runloop的理解</h3><p>一个runloop就是一个事件处理的循环，用来不停的调度工作以及处理输入事件，使用runloop的目的是让线程在有工作的时候忙于工作，而没工作的时候处于休眠状态。</p>
<h3 id="如何调用drawRect方法与layoutSubView方法，以及它们的作用"><a href="#如何调用drawRect方法与layoutSubView方法，以及它们的作用" class="headerlink" title="如何调用drawRect方法与layoutSubView方法，以及它们的作用"></a>如何调用drawRect方法与layoutSubView方法，以及它们的作用</h3><ul>
<li>通过setNeedsDisplay方法调用drawRect方法来绘图；</li>
<li>通过setNeedsLayout方法异步调用layoutSubView方法来布局子视图。</li>
</ul>
<h3 id="OC的理解与特性"><a href="#OC的理解与特性" class="headerlink" title="OC的理解与特性"></a>OC的理解与特性</h3><ul>
<li>OC作为一门面向对象的语言，自然具有面向对象的语言特性：封装、继承、多态。它既具有静态语言的特性（如C++），又有动态语言的效率（动态绑定、动态加载等）。</li>
<li>Objective-C具有相当多的动态特性，表现为三方面：动态类型（Dynamic typing）、动态绑定（Dynamic binding）和动态加载（Dynamic loading）。所谓动态即必须到运行时（run time）才会做的一些事情。<ul>
<li>动态类型：即运行时再决定对象的类型，这种动态特性在日常的应用中非常常见，简单来说就是id类型。事实上，由于静态类型的固定性和可预知性，从而使用的更加广泛。静态类型是强类型，而动态类型属于弱类型，运行时决定接受者。</li>
<li>动态绑定：基于动态类型，在某个实例对象被确定后，其类型便被确定了，该对象对应的属性和响应消息也被完全确定。</li>
<li>动态加载：根据需求加载所需要的资源，最基本就是不同机型的适配，例如，在Retina设备上加载@2x的图片，而在老一些的普通苹设备上加载原图，让程序在运行时添加代码模块以及其他资源，用户可根据需要加载一些可执行代码和资源，而不是在启动时就加载所有组件，可执行代码可以含有和程序运行时整合的新类。</li>
</ul>
</li>
</ul>
<h3 id="简述内存管理"><a href="#简述内存管理" class="headerlink" title="简述内存管理"></a>简述内存管理</h3><ul>
<li>之前：OC内存管理遵循<strong>“谁创建，谁释放，谁引用，谁管理”</strong>的机制，当创建或引用一个对象的时候，需要向她发送alloc、copy、retain消息，当释放该对象时需要发送release消息，当对象引用计数为0时，系统将释放该对象，这是OC的手动管理机制（MRC）。</li>
<li>目前：iOS 5.0之后引用自动管理机制——自动引用计数（ARC），管理机制与手动机制一样，只是不再需要调用retain、release、autorelease；它编译时的特性，当你使用ARC时，在适当位置插入release和autorelease；它引用strong和weak关键字，strong修饰的指针变量指向对象时，当指针指向新值或者指针不复存在，相关联的对象就会自动释放，而weak修饰的指针变量指向对象，当对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。</li>
</ul>
<blockquote>
<p><em>理解：</em></p>
<ul>
<li>如果使用alloc、copy(mutableCopy)或者retian一个对象时,你就有义务,向它发送一条release或者autorelease消息。其他方法创建的对象,不需要由你来管理内存。</li>
<li>向一个对象发送一条autorelease消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象。</li>
<li>向一个对象发送release消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为0时,系统才会调用dealloc方法,释放该对象和对象本身它所拥有的实例。</li>
</ul>
</blockquote>
<p><em>在ARC下的工程采用非ARC去编译某些类：选中你所要操作的Target，选Build Phases，在其中Complie Sources中选择需要MRC的文件双击，并在输入框中输入<code>-fno-fobjc-arc</code></em></p>
<h3 id="isMemberOfClass和isKindOfClass联系与区别"><a href="#isMemberOfClass和isKindOfClass联系与区别" class="headerlink" title="isMemberOfClass和isKindOfClass联系与区别"></a>isMemberOfClass和isKindOfClass联系与区别</h3><ul>
<li>联系：两者都能检测一个对象是否是某个类的成员</li>
<li>区别：isKindOfClass不仅用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否派生自该类的成员 ,而isMemberOfClass只能做到第一点。</li>
</ul>
<h3 id="assign、strong、copy的用法与区别"><a href="#assign、strong、copy的用法与区别" class="headerlink" title="assign、strong、copy的用法与区别"></a>assign、strong、copy的用法与区别</h3><ul>
<li>assign:普通赋值,一般常用于基本数据类型,常见委托设计模式, 以此来防止循环引用。(我们称之为弱引用).</li>
<li>strong:保留计数,获得到了对象的所有权,引用计数在原有基础上加1.</li>
<li>copy:一般认为,是在内存中重新开辟了一个新的内存空间,用来存储新的对象,和原来的对象是两个不同的地址,引用计数分别为1。但是当copy对象为不可变对象时,那么copy的作用相当于retain。因为,这样可以节约内存空间</li>
</ul>
<h3 id="沙盒的理解"><a href="#沙盒的理解" class="headerlink" title="沙盒的理解"></a>沙盒的理解</h3><p>每个iOS应用都被限制在“沙盒”中，沙盒相当于一个加了仅主人可见权限的文件夹，即在应用程序安装过程中，系统为每个单独的应用程序生成它的主目录和一些关键的子目录。</p>
<blockquote>
<ol>
<li>AppName.app 目录：这是应用程序的程序包目录，包含应用程序的本身。由于应用程序必须经过签名，所以您在运行时不能对这个目录中的内容进行修改，否则可能会使应用程序无法启动。</li>
<li>Documents 目录：您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。</li>
<li><p>Library 目录：这个目录下有两个子目录：</p>
<blockquote>
<ul>
<li>Preferences 目录：包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件，而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.</li>
<li>Caches 目录：用于存放应用程序专用的支持文件，保存应用程序再次启动过程中需要的信息。</li>
</ul>
<p>可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹，除Caches以外，都会被iTunes备份。</p>
</blockquote>
</li>
<li><p>tmp 目录：这个目录用于存放临时文件，保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。</p>
</li>
</ol>
</blockquote>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/术业专攻/">术业专攻</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/总结/">总结</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
    <article id="post-creatMyBlog" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2017/02/05/creatMyBlog/" class="article-date">
      <time datetime="2017-02-05T04:46:11.000Z" itemprop="datePublished">2017-02-05</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/02/05/creatMyBlog/">免费个人博客搭建（Hexo+osChina）</a>
    </h1>
  

      </header>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h2 id="使用工具介绍"><a href="#使用工具介绍" class="headerlink" title="使用工具介绍"></a>使用工具介绍</h2><p><strong>Hexo</strong>是一个快速、简洁且高效的博客框架。Hexo使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。使用者只需要专注于写博客而不需要关注网站是如何生成的。而且还有丰富的博客主题可以选择！</p>
<p><strong>osChina</strong> 码云Pages是一个免费的静态网页托管服务，您可以使用码云 Pages 托管博客、项目官网等静态网页。</p>
<h2 id="搭建环境"><a href="#搭建环境" class="headerlink" title="搭建环境"></a>搭建环境</h2><h3 id="Node-js安装"><a href="#Node-js安装" class="headerlink" title="Node.js安装"></a>Node.js安装</h3><blockquote>
<ol>
<li>首先访问<a href="https://nodejs.org/en/download/" target="_blank" rel="external">Node.js官网</a>,选择对应系统的安装包下载一路安装即可。</li>
<li>安装完成后，可以打开终端输入<code>node -v</code>和<code>npm -v</code>分别查看版本</li>
</ol>
</blockquote>
<h3 id="Git安装"><a href="#Git安装" class="headerlink" title="Git安装"></a>Git安装</h3><blockquote>
<p>此处不做说明，另行查找方法</p>
</blockquote>
<h3 id="Hexo安装"><a href="#Hexo安装" class="headerlink" title="Hexo安装"></a>Hexo安装</h3><blockquote>
<ol>
<li>Node.js和Git都安装好后,首先创建一个文件夹用来存放Hexo的配置文件,如Blog,然后进入Blog里安装Hexo。</li>
<li>在终端执行<code>sudo npm install -g hexo</code>，完成Hexo安装</li>
<li>安装完成该后执行<code>hexo init</code>，完成初始化</li>
<li>执行<code>npm install</code></li>
<li>执行<code>hexo server</code>，运行本地服务</li>
<li>浏览器输入<a href="http://localhost:4000" target="_blank" rel="external">http://localhost:4000</a>，查看默认效果</li>
</ol>
</blockquote>
<h2 id="实际操作"><a href="#实际操作" class="headerlink" title="实际操作"></a>实际操作</h2><h3 id="修改博客主题"><a href="#修改博客主题" class="headerlink" title="修改博客主题"></a>修改博客主题</h3><p>Hexo的主题都是一些前端民间高手写的模版，可以在官方收录的主题中去<a href="https://hexo.io/themes/" target="_blank" rel="external">这里</a>挑选，我用的是<a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" rel="external">这个</a></p>
<blockquote>
<ol>
<li>看上喜欢的主题点击主题名字可以跳转到资源位置，下载资源包即可</li>
<li>将下载的资源包解压，然后整个文件夹放入<code>Blog/themes</code>文件夹中（该文件夹有一个当前的默认主题文件<code>landscape</code>）</li>
<li>打开终端进入到项目目录即<code>cd desktop/Blog</code>，然后<code>vim _config.yml</code>(<strong>注意：</strong>此处是项目中的_config.yml文件而不是thems里面主题包的_config.yml)</li>
</ol>
<p><img src="/2017/02/05/creatMyBlog/1.png" alt="修改_config.yml文件"><br>将红框中的<code>landscape</code>替换为你下载的资源包文件名(此处为<code>hexo-theme-yelee-master</code>)<br><em>注意：这里“：”后面必须要有一个空格，而且这个空格要在英文输入法下，不然会报一些稀奇古怪的错。</em></p>
<ol>
<li>执行<code>hexo server</code>，运行本地服务</li>
<li>浏览器输入<a href="http://localhost:4000" target="_blank" rel="external">http://localhost:4000</a>，查看效果</li>
</ol>
</blockquote>
<h3 id="配置可以添加本地图片（可选）"><a href="#配置可以添加本地图片（可选）" class="headerlink" title="配置可以添加本地图片（可选）"></a>配置可以添加本地图片（可选）</h3><blockquote>
<ol>
<li>首先确认项目中<code>_config.yml</code>(此处项目为Blog)中有<code>post_asset_folder:true</code>。<br>Hexo 提供了一种更方便管理 Asset 的设定<code>post_asset_folder</code>当您设置<code>post_asset_folder</code>为<code>true</code>参数后，在建立文件时，Hexo会自动建立一个与文章同名的文件夹，您可以把与该文章相关的所有资源都放到那个文件夹，如此一来，您便可以更方便的使用资源。</li>
<li>在Hexo的目录下执行<code>npm install https://github.com/CodeFalling/hexo-asset-image --save</code>（需要等待一段时间）。</li>
<li>完成安装后用<code>hexo new &quot;文章名&quot;</code>新建文章的时候会发现<code>source/_posts</code>目录下面会多出一个和文章名字一样的文件夹。图片就可以放在文件夹下面。</li>
<li>只要使用 <code>![图片标题](新建文章的文件名/test.jpg)</code> 就可以插入图片，其中[]里面不写文字则没有图片标题。</li>
</ol>
</blockquote>
<h3 id="写文章"><a href="#写文章" class="headerlink" title="写文章"></a>写文章</h3><p>墙裂建议在项目中使用<code>hexo new &quot;文章名&quot;</code>，然后到<code>source/_posts</code>目录下使用喜欢的编辑器进行文章编辑(我用的MacDown)</p>
<blockquote>
<p>执行<code>hexo server</code>，运行本地服务就可以查看效果</p>
</blockquote>
<h3 id="发布静态html到码云Pages上"><a href="#发布静态html到码云Pages上" class="headerlink" title="发布静态html到码云Pages上"></a>发布静态html到码云Pages上</h3><blockquote>
<ol>
<li>注册码云账号，并创建项目。 <strong>注意：需要建立一个与自己个性地址同名的项目，如 <a href="http://git.oschina.net/ipvb" target="_blank" rel="external">http://git.oschina.net/ipvb</a> 这个用户就要创建项目名为ipvb(不这样的话为有一些麻烦事)</strong></li>
<li>创建好项目后复制项目的Https的地址</li>
<li>在项目目录下，终端执行<code>hexo generate</code>，生成静态文件到项目根目录的public文件夹中(此时你会发现根目录多了个public文件夹)</li>
<li>配置项目根目录<code>_config.yml</code>文件，修改<code>deploy</code>的值</li>
</ol>
<p><img src="/2017/02/05/creatMyBlog/2.png" alt="修改deploy的值"></p>
<ol>
<li>安装部署插件，执行<code>npm install hexo-deployer-git --save</code></li>
<li>在项目根目录执行<code>hexo deploy</code>(一键部署功能，实际上是将项目中public的文件通过git上传到码云对应的那个项目中，第一次部署会要求输入码云的账号及密码)</li>
<li>部署成功之后，登录码云，查看之前创建的项目中出现了public 文件夹中的文件，这时候代表之前的部署是成功的。然后如下图，启动码云的pages功能：</li>
</ol>
<p><img src="/2017/02/05/creatMyBlog/3.png" alt="启动pages服务"></p>
<ol>
<li>之后每次需要部署就先执行<code>hexo generate</code>,再执行<code>hexo deploy</code>。或者直接执行组合命令<code>hexo g -d</code></li>
</ol>
</blockquote>
<h3 id="装饰博客"><a href="#装饰博客" class="headerlink" title="装饰博客"></a>装饰博客</h3><p>此处贴出本博客使用的主题的配置文档<a href="http://moxfive.coding.me/yelee/" target="_blank" rel="external">地址</a></p>

      
    </div>
    
    <div class="article-info article-info-index">
      
      
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/开疆拓土/">开疆拓土</a>
    </div>


      
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/其它/">其它</a></li></ul>
    </div>

      
      <div class="clearfix"></div>
    </div>
    
  </div>
  
</article>









  
  
</div>
      <footer id="footer">
    <div class="outer">
        <div id="footer-info">
            <div class="footer-left">
                <i class="fa fa-copyright"></i> 
                2017-2019 潍夫子
            </div>
            <div class="footer-right">
                <a href="http://hexo.io/" target="_blank" title="A fast, simple &amp; powerful blog framework">Hexo</a>  Theme <a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" title="Another simple and elegant theme for Hexo  v3.5">Yelee</a> by MOxFIVE <i class="fa fa-heart animated infinite pulse"></i>
            </div>
        </div>
        
            <div class="visit">
                
                    <span id="busuanzi_container_site_pv" style='display:none'>
                        <span id="site-visit" title="Site Visitors"><i class="fa fa-user" aria-hidden="true"></i><span id="busuanzi_value_site_uv"></span>
                        </span>
                    </span>
                
                
                    <span>| </span>
                
                
                    <span id="busuanzi_container_page_pv" style='display:none'>
                        <span id="page-visit"  title="Page Hits"><i class="fa fa-eye animated infinite pulse" aria-hidden="true"></i><span id="busuanzi_value_page_pv"></span>
                        </span>
                    </span>
                
            </div>
        
    </div>
</footer>
    </div>
    
<script data-main="/js/main.js" src="//cdn.bootcss.com/require.js/2.2.0/require.min.js"></script>

    <script>
        $(document).ready(function() {
            var iPad = window.navigator.userAgent.indexOf('iPad');
            if (iPad > -1 || $(".left-col").css("display") === "none") {
                var bgColorList = ["#9db3f4", "#414141", "#e5a859", "#f5dfc6", "#c084a0", "#847e72", "#cd8390", "#996731"];
                var bgColor = Math.ceil(Math.random() * (bgColorList.length - 1));
                $("body").css({"background-color": bgColorList[bgColor], "background-size": "cover"});
            }
            else {
                var backgroundnum = 5;
                var backgroundimg = "url(/background/bg-x.jpg)".replace(/x/gi, Math.ceil(Math.random() * backgroundnum));
                $("body").css({"background": backgroundimg, "background-attachment": "fixed", "background-size": "cover"});
            }
        })
    </script>





<div class="scroll" id="scroll">
    <a href="#" title="Back to Top"><i class="fa fa-arrow-up"></i></a>
    <a href="#comments" onclick="load$hide();" title="Comments"><i class="fa fa-comments-o"></i></a>
    <a href="#footer" title="Go to Bottom"><i class="fa fa-arrow-down"></i></a>
</div>
<script>
    // Open in New Window
    
        var oOpenInNew = {
            
            
            
            
            
            
             archives: ".archive-article-title", 
             miniArchives: "a.post-list-link", 
            
             friends: "#js-friends a", 
             socail: ".social a" 
        }
        for (var x in oOpenInNew) {
            $(oOpenInNew[x]).attr("target", "_blank");
        }
    
</script>

<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
  </div>
</body>
</html>